package cn.tedu.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
// import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class LockDemo {

    static int i;

    public static void main(String[] args) throws InterruptedException {

        // Lock lock = new ReentrantLock();

        ReadWriteLock rwl = new ReentrantReadWriteLock();
        // 根据场景来确定使用读锁还是写锁
        // 获取到写锁
        Lock lock = rwl.writeLock();
        new Thread(new Add(lock)).start();
        new Thread(new Add(lock)).start();

        // main所在的类是一个线程类 - 主线程
        // 主线程在执行过程中，需要启动其他的两个线程 - Add
        // 当Add线程还在启动过程中的时候，主线程就会抢占CPU继续执行
        // 所以需要让主线程即使抢到CPU执行权也需要阻塞一段时间
        Thread.sleep(5000);
        System.out.println(i);

    }

}

class Add implements Runnable {

    private final Lock lock;

    public Add(Lock lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        // 加锁
        lock.lock();
        for (int i = 0; i < 100000; i++) {
            LockDemo.i++;
        }
        // 解锁
        lock.unlock();
    }

}
